package com.aqie.easy.string;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 859 交换A中两个字母得到B 返回true
 */
public class BuddyStrings {
    /**
     * 20ms
     * 1.如果字符串A的长度不等于字符串B的长度、字符串A等于字符串B等于空字符串以及字符串A的长度等于字符串B的长度等于1，返回false。
     *
     * 2.相对位置进行比较，并用HashMap记录字符串A每个元素的个数。若相对位置元素不一样count++，若count大于2，返回false。
     *
     * 3.如果count等于0，代表字符串A和字符串B完全相等，这时候判断字符串A中是否有元素个数大于2，若有返回true。
     *
     * 4.如果count等于1，返回false。
     *
     * 5.如果count等于2，比较(A.charAt(i) == B.charAt(j)) && (A.charAt(j) == B.charAt(i)),若为true，返回true，反
     * @param A
     * @param B
     * @return
     */
    public boolean buddyStrings(String A, String B) {
        if (A.length() != B.length() || (A.equals("") && B.equals("")) || (A.length()==1 && B.length() == 1)) {
            return false;
        }
        HashMap<Character,Integer> map = new HashMap<>();
        List<Integer> list = new ArrayList<>();
        int count = 0;
        for (int i=0; i<A.length(); i++) {
            if (map.containsKey(A.charAt(i))) {
                map.put(A.charAt(i),map.get(A.charAt(i)) + 1);
            } else {
                map.put(A.charAt(i),1);
            }
            if (A.charAt(i) != B.charAt(i)) {
                count++;
                list.add(i);
                if (count > 2) {
                    return false;
                }
            }
        }
        if (count == 0) {
            if (A.equals(B)) {
                Object[] lists = map.values().toArray();
                for (int i=0; i<lists.length; i++) {
                    if ((Integer)lists[i] >= 2) {
                        return true;
                    }
                }
            }
        }
        if (count == 1) {
            return false;
        }
        if (count == 2) {
            if (A.charAt(list.get(0)) == B.charAt(list.get(1)) && A.charAt(list.get(1)) == B.charAt(list.get(0))) {
                return true;
            }
        }
        return false;

    }

    /**
     * 3ms
     * 字符串长度不相等, 直接返回false
     * 字符串相等的时候, 只要有重复的元素就返回true
     * A, B字符串有不相等的两个地方, 需要查看它们交换后是否相等即可.
     * @param A
     * @param B
     * @return
     */
    public boolean buddyStrings2(String A, String B) {
        if (A.length() != B.length()) return false;
        if (A.equals(B)) {
            int[] count = new int[26];
            for (int i = 0; i < A.length(); ++i)
                count[A.charAt(i) - 'a']++;

            for (int c: count)
                if (c > 1) return true;
            return false;
        } else {
            int first = -1, second = -1;
            for (int i = 0; i < A.length(); ++i) {
                if (A.charAt(i) != B.charAt(i)) {
                    if (first == -1)
                        first = i;
                    else if (second == -1)
                        second = i;
                    else
                        return false;
                }
            }

            return (second != -1 && A.charAt(first) == B.charAt(second) &&
                    A.charAt(second) == B.charAt(first));
        }
    }

}
